package controlador;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
 







import modelo.entidad.Anuncio;
import modelo.entidad.Foto;
import modelo.entidad.Municipio;
import modelo.entidad.Pago;
import modelo.entidad.Zona;
import modelo.entidad.Estado;
import modelo.entidad.Sugerencia;
import modelo.entidad.Usuario;
import modelo.entidad.Inmueble;
import modelo.hibernate.dao.DaoAnuncio;
import modelo.hibernate.dao.DaoSugerencia;
import modelo.hibernate.dao.DaoUbicacion;
import modelo.hibernate.dao.DaoUsuario;
import modelo.hibernate.dao.DaoInmueble;









import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.InputEvent;
import org.zkoss.zk.ui.event.MouseEvent;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Area;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Image;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.PieModel;
import org.zkoss.zul.SimplePieModel;
import org.zkoss.zul.Textbox;
 
public class ControladorIndex extends SelectorComposer<Component>{
	
    private static final String searchUrl = "http://www.zkoss.org/doc/searchresult.jsp?cx=008321236477929467003%3A63kdpeqkkvw&cof=FORID%3A11&q=";
 
    @Wire
    private Textbox txtSugerencia;
    
    private DaoUsuario daoUsuario= new DaoUsuario();
    
	@Wire
	private Combobox cmbTipoOpe;
	@Wire
	private Combobox cmbTipInmueble;
	@Wire
	private Combobox cmbEstado;
	@Wire
	private Combobox cmbMunicipio;
	@Wire
	private Combobox cmbZona;
	@Wire
	private Combobox cmbHab;
	@Wire
	private Combobox cmbPrecio1;
	@Wire
	private Combobox cmbPrecio2;
	@Wire
	private Listbox resultadoBusqueda;
	@Wire
	private Listbox mostrarComentario;
	@Wire
	private Listbox mostrarPublicaciones;
	
	@Wire
	private Image imgImagenPrevia;
	
	@Wire
	private Label lblDir;
	
	@Wire
	private Label lblEstacionamiento;
	
	@Wire
	private Label lblHab;
	
	@Wire
	private Label lblTamano;

    private Municipio municipio;
    private Estado estado;

    private Usuario usuario = new Usuario();
    private DaoInmueble daoInmueble = new DaoInmueble();
    private Inmueble inmueble = new Inmueble();
    
    private DaoAnuncio daoAnuncio = new DaoAnuncio();
    private DaoUbicacion daoubic = new DaoUbicacion();
    private DaoSugerencia daoSug = new DaoSugerencia();
    
    
    private String search;
    private List<Inmueble> inmuebles = new ArrayList<Inmueble>();
    private PieModel pieModel;
    private int memoHeight = 2;
 
    List<Estado> todosEstados;
    List<Zona> zonas;
    List<Municipio> municipios;
    
   
    
    @Init
    public void init() {
    }
 
    public int getMemoHeight() {
		return memoHeight;
	}

	public void setMemoHeight(int memoHeight) {
		this.memoHeight = memoHeight;
	}

	@Command
    @NotifyChange("memoHeight")
    public void changeMemoHeight(
            @ContextParam(ContextType.TRIGGER_EVENT) InputEvent change) {
        try {
            int parsed = Integer.parseInt(change.getValue());
            if (parsed > 0) {
                this.memoHeight = parsed;
            }
        } catch (NumberFormatException nfe) {
            // nothing that we can do here, the validation should pick it up
        }
    }
    
	   private static List<String> habitaciones = new ArrayList<String>();
	   static{
		   habitaciones.add("1");
		   habitaciones.add("2");
		   habitaciones.add("3");
		   habitaciones.add("4");
		   habitaciones.add("5");
		   habitaciones.add("6");
		   habitaciones.add("7");
		   habitaciones.add("8");
	   }
	   private static List<String> precio1 = new ArrayList<String>();
	   static{
		   precio1.add("Desde");
		   precio1.add("100000");
		   precio1.add("200000");
		   precio1.add("300000");
		   precio1.add("400000");
		   precio1.add("500000");
		   precio1.add("600000");
		   precio1.add("800000");
		   precio1.add("1000000");
		   precio1.add("1200000");
		   precio1.add("1500000");
	   }
	   private static List<String> precio2 = new ArrayList<String>();
	   static{
		   precio2.add("Hasta");
		   precio2.add("100000");
		   precio2.add("200000");
		   precio2.add("300000");
		   precio2.add("400000");
		   precio2.add("500000");
		   precio2.add("600000");
		   precio2.add("800000");
		   precio2.add("1000000");
		   precio2.add("1200000");
		   precio2.add("1500000");
	   }
	
	
	   private static List<String> tiposOperacion = new ArrayList<String>();
	   static{
	      tiposOperacion.add("Alquiler");
	      tiposOperacion.add("Venta");
	   }
	   
	   private static List<String> tiposInmueble = new ArrayList<String>();
	   static{
	      tiposInmueble.add("Casa");
	      tiposInmueble.add("Apartamento");
	   }
	   public List<String> getHab()
	   {
		   return habitaciones;
	   }
	   public List<String> getPrecio1()
	   {
		   return precio1;
	   }
	   
	   public List<String> getPrecio2()
	   {
		   return precio2;
	   }
	   public List<String> getTipoOp()
	   {
		   return tiposOperacion;
	   }
	   
	   public List<String> getTipoInm()
	   {
		   return tiposInmueble;
	   }
	   public List<Estado> getEstados() throws Exception{
			  return todosEstados=daoubic.obtenerTodosEstados();
		}
	   
	   public Estado getEstado() {
	       return estado;
	   }
	   
	   public List<Inmueble> getBusqueda()
	   {
		   try {
			return BuscarInmueble();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	   }
 
	   @Listen( "onChange=#cmbEstado")
	   public void selectedEstado() throws Exception
	   {
		  System.out.println("hello");
	   	  Estado s = cmbEstado.getSelectedItem().getValue();
	       	cmbMunicipio.setValue(null);
	       	 municipios = daoubic.BuscarMunicipios(s);
	       	 cmbMunicipio.setModel(new ListModelList<Municipio>(municipios));
	   }
	   

	   @Listen( "onChange=#cmbMunicipio")
	   public void selectedMunicipio() throws Exception
	   {
		     System.out.println("hello");
	   	     Municipio s = cmbMunicipio.getSelectedItem().getValue();
	       	 cmbZona.setValue(null);
	       	 zonas = daoubic.BuscarZonas(s);
	       	 cmbZona.setModel(new ListModelList<Zona>(zonas));
	   }   
	   
	   
//    @Command
//    public void displayArea(@ContextParam(ContextType.TRIGGER_EVENT) MouseEvent event) {
//        Component component = event.getAreaComponent();
// 
//        if (component instanceof Area) {
//            Area area = (Area) component;
//            Clients.alert(area.getAttribute("entity") + ":"
//                    + area.getTooltiptext());
//        }
//    }
// 
//  
// 
//    public static class Contribution {
//        private String area;
//        private int value;
// 
//        public Contribution(String country, int value) {
//            super();
//            this.area = country;
//            this.value = value;
//        }
// 
//        public String getArea() {
//            return area;
//        }
// 
//        public void setArea(String area) {
//            this.area = area;
//        }
// 
//        public int getValue() {
//            return value;
//        }
// 
//        public void setValue(int value) {
//            this.value = value;
//        }
// 
//      }
//    
//    
//    
    ///////////////////////////////////
	@Command
	@NotifyChange("btnBuscar")
    @Listen("onClick=#btnBuscar")  
	public List<Inmueble> BuscarInmueble() throws Exception  {
	   System.out.println("yeah");
	  
	  Session sess = Sessions.getCurrent();
      Usuario usuario=(Usuario)sess.getAttribute("usuario");
      
 
      String tipOperacion = cmbTipoOpe.getSelectedItem().getValue();
      String tipInmueble = cmbTipInmueble.getSelectedItem().getValue();
      String habs = cmbHab.getSelectedItem().getValue().toString();
      estado = cmbEstado.getSelectedItem().getValue();
      municipio = cmbMunicipio.getSelectedItem().getValue();
      Zona zona= cmbZona.getSelectedItem().getValue();
      String prec1 = cmbPrecio1.getSelectedItem().getValue();
      String prec2 = cmbPrecio2.getSelectedItem().getValue();
	
   
      		   List<Inmueble> busqueda= new ArrayList<Inmueble>();
 			   List<Inmueble> datos = daoInmueble.obtenerTodos();
 			   
				for (Inmueble d : datos){
					Inmueble inmueble  = new Inmueble(d.getDireccion(), d.getPrecio(),d.getNrohabitaciones(),d.getNroestacionamientos(),d.getTipooperacion(), d.getTipoInmueble(),d.getTamano())  ;
				
					if (d.getTipoInmueble().equalsIgnoreCase(tipInmueble) && d.getTipooperacion().equalsIgnoreCase(tipOperacion) && Integer.toString(d.getNrohabitaciones()).equalsIgnoreCase(habs) && d.getZona().getNombre().equals(zona.getNombre()) && d.getPrecio() >= Integer.parseInt(prec1)  && d.getPrecio() < Integer.parseInt(prec2)  ){
						busqueda.add(inmueble);	
						Clients.showNotification("Busqueda Satisfactoria","info",null,null,2000);
						
					}
						else 
						Clients.showNotification("No hay datos que coincidan con su busqueda","info",null,null,2000);		
				

			System.out.println("datos");
			System.out.println(datos.size());
			System.out.println("busqueda");
			System.out.println(busqueda.size());
			//daoubic.actualizarZona(zona);
	    
		
				}
				
				return busqueda;
		
	} 
    @Listen("onClick = #btnBuscar")
	public void mostrarBusqueda() throws Exception{
		List<Inmueble> resultado = BuscarInmueble();
		resultadoBusqueda.setModel(new ListModelList<Inmueble>(resultado));
	}
    

	public void mostrarComentario() throws Exception{
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
		List<Sugerencia> resultado = daoSug.obtenerSugerenciasUsuarios(usuario);
		mostrarComentario.setModel(new ListModelList<Sugerencia>(resultado));
	}
	

	@Listen("onSelect = #resultadoBusqueda")
	public void detalleBusqueda(){
		Inmueble selected = resultadoBusqueda.getSelectedItem().getValue();
		System.out.println("hola");
		System.out.println(selected.getDireccion().toString());
		System.out.println(Integer.toString(selected.getNrohabitaciones()) );
		System.out.println(Integer.toString(selected.getNroestacionamientos()));
		
		//imgImagenPrevia.setSrc(selected.getFotos());
		lblDir.setValue(selected.getDireccion().toString());
		lblHab.setValue( Integer.toString(selected.getNrohabitaciones()) );
		lblEstacionamiento.setValue(Integer.toString(selected.getNroestacionamientos()) );
		//lblTamano.setValue(Integer.valueOf(selected.getTamano()));

	}
	
	
    @Listen("onClick = #btnBuscar")
	public void mostrarPublicacion() throws Exception{
		List<Anuncio> resultado = NuevasPublicaciones();
		mostrarPublicaciones.setModel(new ListModelList<Anuncio>(resultado));
	}
	
    @Listen("onClick=#btnAceptar")  
  	public void GuardarSugerencia(){
      
    	try {
    		
    		  
    		Usuario usuario= daoUsuario.obtenerUsuario(0);
    	  	   System.out.println("Sugerencia");
    	  	   System.out.println(usuario.getApellido());
    	  	   
    	   	  Sugerencia sug = new Sugerencia(txtSugerencia.getValue(),usuario);
    	      List<Sugerencia> sugs= usuario.getSugerencias();
    	      sugs.add(sug);
    	      usuario.setSugerencias(sugs);
    	  	 
    	      
    	  		try {
    	  			daoUsuario.modificarUsuario(usuario);
    	  			
    	  			Messagebox.show("Sugerencia Guardada Satisfactoriamente", "Informacion", Messagebox.OK, Messagebox.INFORMATION);
    	  			txtSugerencia.setValue("");
    	  		} catch (Exception e) {
    	  			// TODO Auto-generated catch block
    	  			e.printStackTrace();
    	  		}
    	  		
    	}
    	catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  		
     } 
    
    
   ///METODO QUE RETORNA LAS PUBLICACIONES NUEVAS
    
    public List<Anuncio> NuevasPublicaciones() throws Exception 
      {
    	Session sess = Sessions.getCurrent();
        usuario=(Usuario)sess.getAttribute("usuario");
        List<Inmueble> inmuebles= new ArrayList<Inmueble>();
    	List<Anuncio> anuncios = daoAnuncio.obtenerTodos();
    	List<Anuncio> anunciosaux = new ArrayList<Anuncio>();
    	
    	System.out.println("todos");
    	System.out.println(anuncios.size());
    	
    	for(int i=0; i<anuncios.size(); i++)
    	{
    		System.out.println(anuncios.get(i).getFechapublicacion());
    		Date date1 = new Date();
    		if(anuncios.get(i).getFechapublicacion().before(date1))
       		{
    		System.out.println("Hello");
    		Anuncio anuncio= new Anuncio(anuncios.get(i).getId(), anuncios.get(i).getPrecio(), anuncios.get(i).getFechapublicacion(), anuncios.get(i).getNrodias(), anuncios.get(i).getEstatus());
    		anunciosaux.add(anuncio);
    		}
    	}
    	return anunciosaux;
    }
    
    
    
}
    
 
    
    
